| Предыдущая | Следущая | |
Flash Player 6.
myObject.__resolve = function (name:String) { // код };
name Строка, представляющая имя неопределенного
свойства.
Ничего.
Свойство; ссылка на определяемую пользователем функцию, которая вызывается
если ActionScript
код ссылается на неопределенное свойство или метод.
Если
ActionScript код ссылается на неопределенное свойство или метод объекта, Flash
Player определяет определено ли для объекта свойство __resolve.
Если __resolve определено,
выполняется функция, на которую оно ссылается, с именем неопределенного свойства
или метода в качестве параметра.
Это позволяет программно подставлять значения для неопределенных свойств или
выражения для неопределенных методов и имитировать состояние, в котором они
были бы реально определены.
Это свойство полезно для установления весьма прозрачных клиент-серверных соединений и рекомендуется как способ вызова методов серверной части.
Следующие примеры последовательно наращивают первый пример и иллюстрируют
пять различных применений свойства __resolve.
Во избежание недопонимания, опрераторы, отличающиеся от предыдущих секций приведены
жирным шрифтом.
Применение 1: следующий пример использует свойство __resolve для
создания объекта, все неопределенные свойства которого возвращают значение "Hello,
world!".
// новый объект
var myObject:Object = new Object();
// определим __resolve функцию
myObject.__resolve = function (name) {
return "Hello, world!";
};
trace (myObject.property1); // output: Hello, world!
trace (myObject.property2); // output: Hello, world!
Применение 2: следующий пример использует __resolve как functor,
который генерирует функции. Используя __resolve переориентируем
вызовы неопределенных методов на вызов общей функции myFunction.
// новый объект var myObject:Object = new Object();// определим для __resolve функцию вызоваmyObject.myFunction = function (name) {trace("Method " + name + " was called");};// определим __resolve функцию myObject.__resolve = function (name) {return function () { this.myFunction(name); };}; // проверяем __resolve используя имена неопределенных методов myObject.someMethod(); // output: Method someMethod was called myObject.someOtherMethod(); //output: Method someOtherMethod was called
Применение 3: Следующий пример построен на основе предыдущего за счет добавления
возможности кэширования(запоминания) урегулированных вызовов методов. За счет
кэширования методов __resolve вызывается только один раз для
каждого из интересующих нас методов.
Это позволяет реализовать технологию lazy
construction (ленивое конструирование) методов объектов. Lazy construction
это технология оптимизации, которая откладывает создание, или конструирование,
методов на момент из первого вызова.
// новый объект
var myObject:Object = new Object();
// определим для __resolve функцию вызова
myObject.myFunction = function(name) {
trace("Method "+name+" was called");
};
//определим __resolve функцию
myObject.__resolve = function(name) {
trace("Resolve called for "+name); // to check when __resolve is called
// не только вызываем функцию, но также сохраним ссылку на нее
var f:Function = function () {
this.myFunction(name);
};
// создадим новый метод и присвоим его ссылке
this[name] = f;
// возвращаем ссылку
return f;
};
//проверяем __resolve используя имена неопределенных методов
// __resolve будет вызван только один раз для каждого из имен методов
myObject.someMethod(); // вызывает __resolve
myObject.someMethod(); // не вызывает __resolve, поскольку метод теперь определен
myObject.someOtherMethod(); // вызывает __resolve
myObject.someOtherMethod(); // не вызывает __resolve,метод уже не undefined
Usage 4: Следующий пример построен из предыдущего за счет резервирования имени
метода onStatus() для локального использования, с тем, чтобы
он не обрабатывался таким же способом как другие неопределенные методы. Добавленный
код выделен жирным.
// новый объект
var myObject:Object = new Object();
// определим для __resolve функцию вызова
myObject.myFunction = function(name) {
trace("Method "+name+" was called");
};
//определим __resolve функцию
myObject.__resolve = function(name) {
// резервируем имя “onStatus” для локального использования
if (name == "onStatus") {
return undefined;
}
trace("Resolve called for "+name); // для проверки, когда __resolve вызвана
// не только вызываем функцию, но также сохраним ссылку на нее
var f:Function = function () {
this.myFunction(name);
};
// создадим новый метод и присвоим его ссылке
this[name] = f;
// возвращаем ссылку
return f;
};
// проверяем __resolve используя имя "onStatus"
trace(myObject.onStatus("hello"));
// output: undefined
Usage 5: Следующий пример построен из предыдущего за счет создания functor'а
, который
принимает параметры. Этот пример широко использует arguments
object, и использует некоторые методы Array
class.
// новый объект
var myObject:Object = new Object();
// определим для __resolve общую функцию вызова
myObject.myFunction = function (name) {
arguments.shift();
trace("Method " + name + " was called with arguments: " + arguments.join(','));
};
// определи __resolve функцию
myObject.__resolve = function (name) {
// резервируем имя “onStatus” для локального использования
if (name == "onStatus") {
return undefined;
}
var f:Function = function () {
arguments.unshift(name);
this.myFunction.apply(this, arguments);
};
// создаем новый метод объекта и присваиваем его ссылке
this[name] = f;
// возвращаем ссылку на функцию
return f;
};
//проверяем __resolve используя имена неопределенных методов с параметрами
myObject.someMethod("hello");
// output: Method someMethod was called with arguments: hello
myObject.someOtherMethod("hello","world");
// output: Method someOtherMethod was called with arguments: hello,world
| Посмотреть комментарии LiveDocs | Предыдущая | Следущая | |